/*******************************************************************************
 *                                    ZLG
 *                         ----------------------------
 *                         innovating embedded platform
 *
 * Copyright (c) 2001-present Guangzhou ZHIYUAN Electronics Co., Ltd.
 * All rights reserved.
 *
 * Contact information:
 * web site:    https://www.zlg.cn
 *******************************************************************************/
#ifndef __HPM_XPI_NOR_H__
#define __HPM_XPI_NOR_H__

#ifdef __cplusplus
extern "C" {
#endif  /* __cplusplus*/
#include "common/hpm_common.h"
#include "driver/romapi/hpm_romapi.h"
#include <stdint.h>
#include <stdio.h>

/**
 * \brief 通过 cfg_option 获取 XPI NOR 配置
 *
 * \param[in] p_reg_base    XPI 基地址
 * \param[in] p_nor_cfg     存储 XPI NOR 配置的缓存
 * \param[in] p_cfg_option  XPI NOR 配置选择
 *
 * \retval 成功返回 0
 */
static inline hpm_stat_t rom_xpi_nor_cfg_get(XPI_Type                *p_reg_base,
                                             xpi_nor_config_t        *p_nor_cfg,
                                             xpi_nor_config_option_t *p_cfg_option){
    return ROM_API_TABLE_ROOT->xpi_nor_driver_if->get_config(p_reg_base, p_nor_cfg, p_cfg_option);
}

/**
 * \brief 基于 NOR 配置初始化 XPI NOR
 *
 * \param[in] p_reg_base XPI 基地址
 * \param[in] p_nor_cfg  XPI NOR 配置
 *
 * \retval 成功返回 0
 */
static inline hpm_stat_t rom_xpi_nor_init(XPI_Type *p_reg_base, xpi_nor_config_t *p_nor_cfg){
    return ROM_API_TABLE_ROOT->xpi_nor_driver_if->init(p_reg_base, p_nor_cfg);
}

/**
 * \brief 自动配置 XPI NOR
 *
 * \param[in] p_reg_base   XPI 基地址
 * \param[in] p_nor_cfg    存储初始化的 XPI NOR 配置缓存
 * \param[in] p_cfg_option XPI NOR 配置选择
 *
 * \retval 成功返回 0
 */
static inline hpm_stat_t rom_xpi_nor_auto_cfg(XPI_Type                *p_reg_base,
                                              xpi_nor_config_t        *p_nor_cfg,
                                              xpi_nor_config_option_t *p_cfg_option){
    return ROM_API_TABLE_ROOT->xpi_nor_driver_if->auto_config(p_reg_base, p_nor_cfg, p_cfg_option);
}

/**
 * \brief 获取 XPI NOR 属性
 *
 * \param[in] p_reg_base   XPI 基地址
 * \param[in] p_nor_cfg    XPI NOR 配置
 * \param[in] property_id  属性 ID
 * \param[in] p_value      存储返回的值
 *
 * \retval 成功返回 0
 */
static inline hpm_stat_t rom_xpi_nor_property_get(XPI_Type         *p_reg_base,
                                                  xpi_nor_config_t *p_nor_cfg,
                                                  uint32_t          property_id,
                                                  uint32_t         *p_value){
    return ROM_API_TABLE_ROOT->xpi_nor_driver_if->get_property(p_reg_base, p_nor_cfg, property_id, p_value);
}

/**
 * \brief 擦除 FLASH 指定的段
 *
 * \param[in] p_reg_base   XPI 基地址
 * \param[in] channel      XPI 传输通道
 * \param[in] p_nor_config XPI NOR 配置
 * \param[in] start        擦除起始地址
 * \param[in] length       要擦除的段大小
 *
 * \retval 成功返回 0
 */
static inline hpm_stat_t rom_xpi_nor_erase(XPI_Type               *p_reg_base,
                                           xpi_xfer_channel_t      channel,
                                           const xpi_nor_config_t *p_nor_config,
                                           uint32_t                start,
                                           uint32_t                length){
    return ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase(p_reg_base, channel, p_nor_config, start, length);
}

/**
 * \brief 擦除 FLASH 指定的块
 *
 * \param[in] p_reg_base   XPI 基地址
 * \param[in] channel      XPI 传输通道
 * \param[in] p_nor_config XPI NOR 配置
 * \param[in] addr         块起始地址
 *
 * \retval 成功返回 0
 */
static inline hpm_stat_t rom_xpi_nor_erase_block(XPI_Type               *p_reg_base,
                                                 xpi_xfer_channel_t      channel,
                                                 const xpi_nor_config_t *p_nor_config,
                                                 uint32_t                addr){
    return ROM_API_TABLE_ROOT->xpi_nor_driver_if->erase_block(p_reg_base, channel, p_nor_config, addr);
}

/**
 * \brief 编程数据到 FLASH 指定地址（阻塞模式）
 *
 * \param[in] p_reg_base   XPI 基地址
 * \param[in] channel      XPI 传输通道
 * \param[in] p_nor_config XPI NOR 配置
 * \param[in] p_src        要编程的数据缓存
 * \param[in] dst_addr     FLASH 目的地址
 * \param[in] length       要编程的数据长度
 *
 * \retval 成功返回 0
 */
static inline hpm_stat_t rom_xpi_nor_program(XPI_Type               *p_reg_base,
                                             xpi_xfer_channel_t      channel,
                                             const xpi_nor_config_t *p_nor_config,
                                             const uint32_t         *p_src,
                                             uint32_t                dst_addr,
                                             uint32_t                length){
    return ROM_API_TABLE_ROOT->xpi_nor_driver_if->program(p_reg_base, channel, p_nor_config, p_src, dst_addr, length);
}

/**
 * \brief 从 FLASH 特定的地址读数据
 *
 * \param[in] p_reg_base   XPI 基地址
 * \param[in] channel      XPI 传输通道
 * \param[in] p_nor_config XPI NOR 配置
 * \param[in] p_dst        读缓存
 * \param[in] start        FLASH 读起始地址
 * \param[in] length       读的长度
 *
 * \retval 成功返回 0
 */
static inline hpm_stat_t rom_xpi_nor_read(XPI_Type               *p_reg_base,
                                          xpi_xfer_channel_t      channel,
                                          const xpi_nor_config_t *p_nor_config,
                                          uint32_t               *p_dst,
                                          uint32_t                start,
                                          uint32_t                length){
    return ROM_API_TABLE_ROOT->xpi_nor_driver_if->read(p_reg_base, channel, p_nor_config, p_dst, start, length);
}

#endif

